/**
 * 轮播图数据访问对象
 * 负责轮播图相关的数据库操作
 */

const db = uniCloud.database();
const bannersCollection = db.collection('banners');

class BannerDao {
  /**
   * 获取启用状态的轮播图列表
   * @returns {Promise<Array>} 轮播图数据数组
   */
  async getActiveBanners() {
    try {
      const { data } = await bannersCollection
        .where({
          status: 1
        })
        .orderBy('sort_order', 'asc')
        .get();
      return data;
    } catch (error) {
      console.error('获取轮播图列表失败:', error);
      throw new Error('获取轮播图列表失败');
    }
  }

  /**
   * 根据ID获取轮播图详情
   * @param {string} id - 轮播图ID
   * @returns {Promise<Object|null>} 轮播图详情对象
   */
  async getBannerById(id) {
    try {
      const { data } = await bannersCollection.doc(id).get();
      return data[0] || null;
    } catch (error) {
      console.error('获取轮播图详情失败:', error);
      throw new Error('获取轮播图详情失败');
    }
  }

  /**
   * 创建新轮播图
   * @param {Object} bannerData - 轮播图数据
   * @returns {Promise<Object>} 创建结果
   */
  async createBanner(bannerData) {
    try {
      const result = await bannersCollection.add({
        ...bannerData,
        create_time: db.serverDate(),
        update_time: db.serverDate()
      });
      return result;
    } catch (error) {
      console.error('创建轮播图失败:', error);
      throw new Error('创建轮播图失败');
    }
  }

  /**
   * 更新轮播图
   * @param {string} id - 轮播图ID
   * @param {Object} updateData - 更新数据
   * @returns {Promise<Object>} 更新结果
   */
  async updateBanner(id, updateData) {
    try {
      const result = await bannersCollection.doc(id).update({
        ...updateData,
        update_time: db.serverDate()
      });
      return result;
    } catch (error) {
      console.error('更新轮播图失败:', error);
      throw new Error('更新轮播图失败');
    }
  }

  /**
   * 删除轮播图
   * @param {string} id - 轮播图ID
   * @returns {Promise<Object>} 删除结果
   */
  async deleteBanner(id) {
    try {
      const result = await bannersCollection.doc(id).remove();
      return result;
    } catch (error) {
      console.error('删除轮播图失败:', error);
      throw new Error('删除轮播图失败');
    }
  }

  /**
   * 获取轮播图总数
   * @returns {Promise<number>} 轮播图总数
   */
  async getBannerCount() {
    try {
      const { total } = await bannersCollection.count();
      return total;
    } catch (error) {
      console.error('获取轮播图总数失败:', error);
      throw new Error('获取轮播图总数失败');
    }
  }
}

module.exports = BannerDao;